#include <iostream>
#include <random>
#include <sstream>
#include <iomanip>
#include <atomic>

/**
 * @brief 生成自定义格式的伪随机UUID字符串
 * @return std::string 格式示例：3cd2b7a4-6b27-471f-8000-000000000001
 * @note 特点：
 *     1. 前16字符为随机数生成（8字节，十六进制表示）
 *     2. 后16字符为自增序列号（8字节，十六进制表示）
 *     3. 使用连字符分隔各部分，格式：xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
 * @warning 不符合RFC4122标准UUID规范，适用于需要唯一标识符的非加密场景
 */
static std::string uuid() 
{
    // 第一部分：生成随机数部分（前16字符）
    std::random_device rd;  // 硬件熵源生成真随机数种子
    std::mt19937_64 generator(rd());  // 使用梅森旋转算法生成64位伪随机数
    std::uniform_int_distribution<int> distribution(0, 255);  // 生成0-255的均匀分布
    
    std::stringstream ss;
    // 生成前8字节随机数（16个十六进制字符）
    for (int i = 0; i < 8; i++) 
    {
        ss << std::setw(2) << std::setfill('0')  // 固定两位宽度，不足补零
           << std::hex << distribution(generator);  // 转换为十六进制
        
        // 在指定位置插入分隔符（第4、6、8字节后）
        if (i == 3 || i == 5 || i == 7) 
        {
            ss << "-";
        }
    }

    // 第二部分：生成自增序列部分（后16字符）
    static std::atomic<size_t> seq(1);  // 原子计数器，保证线程安全
    size_t num = seq.fetch_add(1);  // 原子自增操作
    
    // 将64位整数分解为8个字节（从高位到低位）
    for (int i = 7; i >= 0; i--) 
    {
        // 右移并掩码获取单个字节
        ss << std::setw(2) << std::setfill('0')
           << std::hex << ((num >> (i * 8)) & 0xFF);
        
        // 在第7字节后插入分隔符
        if (i == 6) ss << "-";
    }

    return ss.str();
}

int main() 
{
    // 生成并输出20个UUID示例
    for (int i = 0; i < 20; i++) 
    {
        std::cout << uuid() << std::endl;
    }
    return 0;
}